package tag

import org.codehaus.groovy.grails.commons.ApplicationHolder

class MenuTagLib 
{
	def authenticateService

	def perfis
	
	static namespace = "h"   // Para podermos utilizar um namespace diferente de g
	
	static HashSet<String> hs = new HashSet<String>()
	
	static
	{
		hs.add("perfil")
		hs.add("classLI")
		hs.add("classAnchor")
		hs.add("classUL")
		hs.add("label")
		hs.add("class")
		hs.add("href")
		hs.add("action")
	}
			
    def toolBar = { attrs, body ->
		def classe = attrs.classUL == null ? "" : "class='${attrs.classUL}'"

		out << "<ul ${classe}>" + body() + "</ul>"
    }

	def dropDownMenu = { attrs, body ->
		
		def perfil = attrs.perfil
		def classLI = attrs.classLI == null ? "" : "class='${attrs.classLI}'"
		def classAnchor = attrs.classAnchor == null ? "" : "class='${attrs.classAnchor}'"
		def classUL = attrs.classUL == null ? "" : "class='${attrs.classUL}'"
		def label = message(code: attrs.label)
		
		if(perfil == null || authenticateService?.ifAnyGranted(perfil)) 
        {	
			out << "<li ${classLI}><a ${classAnchor}><span>${label}</span></a>\n"
			out << "<ul ${classUL}>\n"
			out << body() + "\n"
			out << "</ul>\n"
			out << "</li>\n"
		}
	}

	def menuItem = { attrs, body ->

		def appName = ApplicationHolder.application.metadata['app.name']
		
		def destino = attrs.action == null ? attrs.href : "/${appName}${attrs.action}"  
		// Se action == null, href deve ter sido especificado 
		def perfil = attrs.perfil
		def classLI = attrs.classLI == null ? "" : "class='${attrs.classLI}'"
		def classAnchor = attrs.classAnchor == null ? "" : "class='${attrs.classAnchor}'"
		def label = message(code: attrs.label)

		// perfil tem que ser um String com os nomes dos perfis entre vírgulas.
		// Exemplo: perfil = "ROLE_USUARIO, ROLE_ADMIN"
		if(perfil == null || authenticateService?.ifAnyGranted(perfil)) 
        {	
			out << "<li ${classLI}><a ${classAnchor} "
			outrosAtributos(attrs)
			out << " href='${destino}'>" + body() + "</a></li>"
        }
    }

	// Como este tag não existe na biblioteca do Spring Security foi implementado aqui.
	def isNotLoggedIn = { sttrs, body -> 
		if (session['usuario'] == null)
		{	out << body()
		}
    }

	def isLoggedIn = { sttrs, body ->
		if (session['usuario'] != null)
		{	out << body()
		}
	}
	
	void outrosAtributos(def attrs)
	{
		attrs.each{
			if(!hs.contains(it.key))
			{
				out << it.key + "='" + it.value + "' "
			}
		}
	}
}
